package com.lecyon.farm.rest;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lecyon.farm.base.BaseRequestPageVo;
import com.lecyon.farm.base.BaseRequestVo;
import com.lecyon.farm.base.BaseResponse;
import com.lecyon.farm.base.RestResponse;
import com.lecyon.farm.vo.copy.DuplicateVo;
import com.lecyon.farm.vo.request.IdsVo;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @param <A> 新增对象
 * @param <A> 修改对象
 * @param <T> 操作对象
 * @param <Q> 查询条件对象
 * @param <V> 查询结果对象
 * @param <P> 分页信息对象
 * @param <S> 更改状态对象
 * @param <E> 导出Excel对象
 * @author Yao Zheng
 */
public interface IRestService<A, M, T, Q, V, P, S, E> extends IService<T> {

    /**
     * 插入一条记录（选择字段，策略插入）
     *
     * @param addVo 新增对象
     * @return RestResponse<Long>
     */
    RestResponse<Long> add(A addVo);

    /**
     * 插入一条记录，如果数据判定重复，则进行记录累加
     * 用于各类带数量的明细表数量累加
     *
     * @param addVo 新增对象
     * @return RestResponse<Long> 返回的id为原有数据id
     */
    RestResponse<Long> cumulative(A addVo);

    /**
     * 编辑一条记录（选择字段，策略插入）
     *
     * @param modifyVo 编辑对象
     * @return BaseResponse
     */
    RestResponse<Long> modify(M modifyVo);

    /**
     * 复制一条记录
     *
     * @param duplicateVo 复制对象Vo
     * @return RestResponse<Long> 返回的id为复制后的数据id
     */
    RestResponse<Long> duplicate(DuplicateVo duplicateVo);

    /**
     * 更改一条记录的状态
     *
     * @param statusVo 更改状态对象
     * @return BaseResponse
     */
    BaseResponse changeStatus(S statusVo);

    /**
     * 查看记录
     *
     * @param vo 查询条件
     * @return 查询结果
     */
    RestResponse<V> get(Q vo);

    /**
     * 查询记录 带分页
     *
     * @param vo 查询条件
     * @return 查询结果
     */
    RestResponse<Page<V>> getPageList(@Validated BaseRequestPageVo<Q> vo);

    /**
     * 查询记录 不带分页
     *
     * @param vo 查询条件
     * @return 查询结果
     */
    RestResponse<List<V>> getList(BaseRequestVo<Q> vo);

    /**
     * 导出查询记录
     *
     * @param vo 查询条件
     * @return 导出结果存放的Url
     */
    RestResponse<String> exportExcel(@Validated BaseRequestVo<Q> vo);

    /**
     * 删除操作，包含单条删除与批量删除
     *
     * @param idsVo
     * @return
     */
    BaseResponse delete(@NotNull IdsVo idsVo);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     * @return BaseResponse
     */
    BaseResponse deleteById(Long id);

    /**
     * 删除（根据ID 批量删除）
     *
     * @param idList 主键ID列表
     * @return BaseResponse
     */
    BaseResponse deleteByIds(List<Long> idList);
}
